﻿namespace ConsoleApp6
{
    //6、委托    是一种引用类型变量，存储某一个方法的内存地址
    //委托的多播   一个主委托对象可以容纳多个其他的子委托对象，当调用主委托对象，会将所有子委托全部按序运行
    //多播调用的返回值是最后一个执行委托的返回值
    //多播创建  如： OnClickDelegate OnClick = gameStartButton + friendButton
    internal class Program
    {
        static void Main(string[] args)
        {
            DelegateExample delegateExample = new DelegateExample();
            delegateExample.DoFunction();

            
            Console.WriteLine("\n***********");

            GameController controller = new GameController();

            Button gameStartButton = new Button();
            gameStartButton.OnClick = new Button.OnClickDelegate(controller.OnGameStart);
            gameStartButton.Click();

            Console.WriteLine("***********");

            Button friendButton = new Button();
            friendButton.OnClick=new Button.OnClickDelegate(controller.OnFriend);
            friendButton.Click();

            Console.WriteLine("***********");
            //多播
            Button.OnClickDelegate totalButton = gameStartButton.OnClick + friendButton.OnClick;
            foreach(Button.OnClickDelegate c in totalButton.GetInvocationList())
            {
                c();
            }
        }
    }



    class DelegateExample
    {
        public delegate void DoDelegate(string valueStr);
        internal void DoFunction()
        {
            //声明一个委托变量，并把已知方法作为构造函数的参数
            DoDelegate doDelegate = new DoDelegate(Test);
            //通过委托的静态方法Invoke触发委托
            doDelegate.Invoke("传入委托的值！");

        }

        void Test(string valueStr)
        {
            Console.Write($"valueStr={valueStr}");
        }
    }

    


}